• ThreadLocalMap通过key(ThreadLocal类型)的hashcode来计算数组存储的索引位置i。如果i位置已经存储了对象,那么就往后挪一个位置依次类推,直到找到空的位置,再将对象存放。另外,在最后还需要判断一下当前的存储的对象个数是否已经超出了阈值(threshold的值)大小,如果超出了,需要重新扩充并将所有的对象重新计算位置
  • Java中所有错误和异常的父类是java.lang.Throwable
  • synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,称之为对象锁,而修饰静态方法,实际上是对该类对象加锁,俗称类锁
  • volatile关键字作用
    • 每次从内存中取值,不从缓存中什么的拿值。这就保证了volatile修饰的共享变量,每次的更新对于其他线程都是可见的
    • volatile保证了其他线程的立即可见性,没有保证原子性
    • 由于有些时候对volatile的操作,不会被保存,所以不会造成阻塞,不可用于多线程环境下的计数器
  • Java中基本的编程单元为类
  • 实现接口相当于重写方法,方法的重写需要满足:三同一大一小(方法名、返回值类型、形参相同;访问权限 >= 重写前; 抛出异常 <= 重写前)
    • 此处应注意接口的方法隐式为public abstract,所以实现接口对应方法访问权限应为public
  • 在继承中代码的执行顺序如下所示
    • 父类静态对象 -> 父类静态代码块
    • 子类静态对象 -> 子类静态代码块
    • 父类非静态对象 -> 父类非静态代码块
    • 父类构造函数
    • 子类非静态对象 -> 子类非静态代码块
    • 子类构造函数
  • 集合常见考点

img

  • Iterator接口是Collection接口的父接口

  • wait():等待时线程别人可以用

  • sleep():等待时线程还是自己的,别人不能用

  • join():等待该线程终止,等待调用join方法的线程结束,再继续执行

    • 如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测
  • yield():不会释放锁,只是通知调度器自己可以让出cpu时间片,但只是建议,调度器也不一定采纳,同优先级的其他线程有机会获得锁

  • 构造方法是一种特殊的方法,具有以下特点

    • 构造方法的方法名必须与类名相同
    • 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型
    • 构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域
    • 一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码
    • 构造方法可以重载,以参数的个数,类型,顺序
  • 多态的作用:提高可重用性和扩展代码模块

  • HashTable中,key和value都不允许出现null值

  • volatile保证数据的可见性,但不能完全保证数据的原子性synchronized保证了数据的可见性也保证了原子性

  • 抽象类和接口都不能被实例化

  • 反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化

  • 字符流和字节流都有缓冲流

  • 面向对象如果有三大特征,那就是:封装、继承、多态

  • 面向对象如果有四大特征,那就是:抽象、封装、继承、多态

  • 外部类的修饰符只能是public,abstract,final

  • 使用泛型的好处:仅仅提高了数据传输的安全性,并没有改变程序运行的性能

    • 类型安全
    • 消除强制类型转换
  • Java不同于一般的编译语言和直译语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了一次编写,到处运行的跨平台特性

  • Hashtable 的函数都是同步的,这意味着它是线程安全的,它的key、value都不可以为null

  • synchronized修饰非静态方法 锁的是this 对象

  • synchronized修饰静态方法 锁的是class对象

  • 二维数组定义,一维长度必须定义,二维可以后续定义

  • private default protected public
    同一个类中 ✔️ ✔️ ✔️ ✔️
    同一个包中 ✔️ ✔️ ✔️
    子类中 ✔️ ✔️
    全局范围内 ✔️
  • 堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)

  • 栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈

  • 方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)

  • 标识符的组成:由52个字母A-Z ,a-z ,数字0-9 ,下划线_ , 美元符$组成

  • Object类中方法

    • protected Object clone():创建并返回此对象的一个副本
    • boolean equals(Object obj):指示其他某个对象是否与此对象“相等”
    • protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
    • class getClass():返回此 Object 的运行时类
    • int hashCode():返回该对象的哈希码值
    • void notify():唤醒在此对象监视器上等待的单个线程
    • void notifyAll():唤醒在此对象监视器上等待的所有线程
    • String toString():返回该对象的字符串表示
    • void wait():在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
    • void wait(long timeout):在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待
    • void wait(long timeout, int nanos):在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待
  • 数组是一个对象,不同类型的数组具有不同的类

  • Java反射机制主要提供了以下功能

    • 在运行时判断一个对象的所属类
    • 在运行时构造一个类的对象
    • 在运行时判断一个类所具有的成员变量和方法
    • 在运行时调用一个对象的方法
  • java中的关键字

    • 48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while
    • 2个保留字(现在没用以后可能用到作为关键字):goto、const
    • 3个特殊直接量(非关键字):true、false、null
  • CopyOnWriteArrayList适用于写少读多的并发场景

  • ReadWriteLock即为读写锁

    • 要求写与写之间互斥,读与写之间互斥
    • 读与读之间可以并发执行,在读多写少的情况下可以提高效率
  • switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型,String类型是java7开始支持。

  • 处理异常有两种方式(使用try…catch块捕获时可以没有catch块,但当没用catch块的时候必须得有finally块

    • try…catch(捕获处理机制)
    • throws(冒泡处理机制)
  • 抽象类不能实例化,因为有抽象方法未实现,可以被抽象类继承,也可以被非抽象类继承

  • Math.floor() 表示向下取整,返回double类型 (floor—地板)

  • Math.ceil() 表示向上取整,返回double类型 (ceil—天花板)

  • Math.round() 四舍五入,返回int类型

  • 使用Integer a = 1;Integer a = Integer.valueOf(1);在值介于-128至127直接时,作为基本类型

  • 使用Integer a = new Integer(1);时,无论值是多少,都作为对象

  • 函数调用是入栈出栈,栈是在寄存器之下的速度最快,且占的空间少;而自定义异常是存在堆中,因此异常的内存开销大

  • 真正宣布一个对象死亡,至少需要经历2次标记过程。当第一次标记时会同时进行一次筛选(判断此对象是否有必要执行finalize方法,如果对象没有覆盖该方法,就面临死亡,所以说finalize()方法是对象逃脱死亡命运的最后一次机会

  • Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节

  • Java的基本编程单元是类,基本存储单元是变量

  • 类的final成员对象必须满足以下其中一个条件

    • 在构造函数中赋值
    • 初始化赋值
  • 标准ASCII只使用7个bit,扩展的ASCII使用8个bit

  • 表达式的数据类型自动提升, 关于类型的自动提升,注意下面的规则

    • 所有的byte,short,char型的值将被提升为int型
    • 如果有一个操作数是long型,计算结果是long型
    • 如果有一个操作数是float型,计算结果是float型
    • 如果有一个操作数是double型,计算结果是double型
    • final常量级别运算在编译过程中就已经出结果了
  • 序列化保存的是对象的状态,静态变量属于类的状态,因此不保存静态变量

  • 基本类型不是对象

  • 错误(Error)的基类是Throwable

  • Semaphore:信号量,用于表示共享资源数量。用acquire()获取资源,用release()释放资源。

  • CyclicBarrier:线程到达屏障后等待,当一组线程都到达屏障后才一起恢复执行

  • CountDownLatch:初始时给定一个值,每次调用countDown值减1,当值为0时阻塞的线程恢复执行

  • 内部类可以是静态static的,也可用public,default,protected和private修饰

  • 外部类的修饰符只能是public,abstract,final